package cn.bugstack.springframework.aop;

import org.aopalliance.intercept.MethodInterceptor;

/**
 * Base class for AOP proxy configuration managers.
 * These are not themselves AOP proxies, but subclasses of this class are
 * normally factories from which AOP proxy instances are obtained directly.
 *
 * AdvisedSupport将代理、拦截、匹配的各项属性包装到一个类中，方便在Proxy实现类中使用。
 * 这与在业务开发中包装入参是一个道理。
 * TargetSource是一个目标对象，在目标对象类中提供Object入参属性，以及获取目标类TargetClass的信息。
 * MethodInterceptor是一个具体拦截方法的实现类，由用户实现MethodInterceptor#invoke方法并进行具体的处理
 */

/**
 * org.aopalliance.intercept.MethodInterceptor 是 AOP 联盟规范中定义的一个接口，
 * 用于在方法调用前后拦截并执行额外的逻辑。它是实现面向切面编程（AOP）的关键接口之一。
 * 该接口定义了一个方法：
 * Object invoke(MethodInvocation invocation) throws Throwable;
 * 其中，invoke 方法接收一个 MethodInvocation 对象作为参数，表示当前方法调用的上下文信息，包括目标对象、目标方法、方法参数等。
 * 在 invoke 方法中，可以对方法调用进行拦截和处理，并最终返回方法调用的结果。
 * 通常，实现 MethodInterceptor 接口的类被称为方法拦截器，它们可以在目标方法执行前后插入自定义的逻辑，比如日志记录、性能监控、事务管理等。
 * 在 AOP 中，方法拦截器是实现切面逻辑的重要组成部分，可以通过 AOP 框架配置和应用到目标方法上。
 */

public class AdvisedSupport {

    // ProxyConfig
    private boolean proxyTargetClass = false;
    // 被代理的目标对象
    private TargetSource targetSource;
    // 方法拦截器
    private MethodInterceptor methodInterceptor;
    // 方法匹配器(检查目标方法是否符合通知条件)
    private MethodMatcher methodMatcher;

    public boolean isProxyTargetClass() {
        return proxyTargetClass;
    }

    public void setProxyTargetClass(boolean proxyTargetClass) {
        this.proxyTargetClass = proxyTargetClass;
    }

    public TargetSource getTargetSource() {
        return targetSource;
    }

    public void setTargetSource(TargetSource targetSource) {
        this.targetSource = targetSource;
    }

    public MethodInterceptor getMethodInterceptor() {
        return methodInterceptor;
    }

    public void setMethodInterceptor(MethodInterceptor methodInterceptor) {
        this.methodInterceptor = methodInterceptor;
    }

    public MethodMatcher getMethodMatcher() {
        return methodMatcher;
    }

    public void setMethodMatcher(MethodMatcher methodMatcher) {
        this.methodMatcher = methodMatcher;
    }
}
